使用 Python 循环执行 SPSS 命令

作者:Ruben Geert van den Berg,归属于 SPSS Python 基础

SPSS 的一个恼人限制是某些命令一次只能处理一个变量。虽然 DO REPEATLOOP 允许我们循环处理变量,但它们仅限于 SPSS 的转换命令。

然而,Python 允许我们循环执行_任何_命令。最重要的是,我们可以使用 TO 关键字,从而避免拼写出所有变量名。

本课程涵盖这两种技术,是本系列课程中最重要的部分之一。让我们开始吧!

人口金字塔

之前我们清理了一些反应时间数据,得到了 trials-renamed.sav 文件,部分数据如下所示。

现在,我们想可视化女性和男性参与者的表现。创建人口金字塔是一个很好的方法。它们可以让我们“快速且粗略地”比较:

等等,在男性和女性之间。首先,我们按照下面的截图创建一个人口金字塔。

SPSS 人口金字塔语法

粘贴后的人口金字塔语法如下:

XGRAPH CHART=[HISTOBAR] BY time_1[s] BY gender[c]
/COORDINATE SPLIT=YES
/BIN START=AUTO SIZE=AUTO
/TITLES TITLE='Reaction Time by Gender'.

显然,一个人口金字塔需要 4 行语法,而我们想要快速查看 20 个金字塔。诚然,我们可以稍微缩短语法,但没必要浪费时间。所以我们至少需要 80 行 语法,对吗?

扩展 SPSS 的 TO 关键字

不对。和之前的课程一样,我们将使用 Python 循环执行此命令,并在每次迭代中使用不同的变量名。在本例中,我们的反应时间变量的名称非常简单,我们可以使用 Python 列表推导式生成所有变量名,如 ["time_%s"%ind for ind in range(1,21)]。但如果变量名不遵循如此简单的模式呢?在 SPSS 中,我们通常使用 SPSS 的 TO 关键字指定一个变量块,该关键字用作第一个和最后一个变量名之间的分隔符。可以添加额外的变量,用空格分隔,例如 time_1 time_3 **to** time_6 time_8 time_12。Python 可以将这个 SPSS 变量规范扩展为一个 Python 变量名列表。这是最重要的 SPSS Python 技术之一,如下所示:

使用 TO 关键字检索变量块

begin program python3.
import spssaux
sDict = spssaux.VariableDict(caseless = True)
varList = sDict.expand("tiME_1 to time_20")
print(varList)
end program.

注意:由于 Python 区分大小写,我们通常需要使用变量名和任何其他 SPSS 对象(SPSS objects)的正确大小写。但是,对于 VariableDict(),添加 caseless = True 允许我们使用任何喜欢的大小写,通常是全部小写。

运行人口金字塔

我们现在可以使用一个简单的 Python for 循环来迭代我们的 XGRAPH 命令。在每次迭代中,Python 将 %s 替换为变量名。这将完成我们的工作。

对变量块运行人口金字塔

begin program python3.
import spssaux,spss
sDict = spssaux.VariableDict(caseless = True)
varList = sDict.expand("time_1 to time_20")
for var in varList:
    spss.Submit('''
    XGRAPH CHART=[HISTOBAR] BY %s[s] BY gender[c]
    /COORDINATE SPLIT=YES
    /BIN START=AUTO SIZE=AUTO
    /TITLES TITLE='Reaction Time by Gender'.
    '''%var)
end program.

结果

将变量标签插入到标题中

我们已经完成了基本工作。但是,我们现在将变量标签插入到图表标题中。spss.GetVariableLabel() 可以通过变量_索引_ (variable indices) 检索变量标签。但是,要通过变量_名称_ (variable names) 获取变量标签,上述 VariableDict() 对象会派上用场(下面的第 8 行)。 在我们的最后一个例子中,我们在每个 XGRAPH 命令中有两个文本替换。当使用多个文本替换时,使用 locals() 通常是一种很好的方法。

使用 locals() 进行文本替换,并将变量标签放入标题中

begin program python3.
import spssaux,spss
sDict = spssaux.VariableDict(caseless = True)
varList = sDict.expand("time_1 to time_20")
for var in varList:
    varLab = sDict[var].VariableLabel
    spss.Submit('''
    XGRAPH CHART=[HISTOBAR] BY %(var)s[s] BY gender[c]
    /COORDINATE SPLIT=YES
    /BIN START=AUTO SIZE=AUTO
    /TITLES TITLE='%(varLab)s by Gender'.
    '''%locals())
end program.